/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Xadrez.Modelo;

/**
 *
 * @author Leonardo
 */
public class Queen extends Piece {

    public Queen() {
    }

    public Queen(String color) {

        this.setColor(color);
        this.setFirstMove(true);

    }

    @Override
    public boolean isValidMove(Move m, Board board) {
        // Analisa se o movimento responde a alguns critérios
        // Se a origem é a mesma do destino, então o movimento não é válido
        // (não implementado ainda)
        // Se o cavalo anda em L
        // Se no destino está ocupado por alguma peça de mesma cor, o movimento não é válido

        boolean validate = false;

        Square origem = m.getOrigin();
        Square destino = m.getDestination();

        if (m.onLimits()) {

            if (destino.getPiece() != null) {
                if (destino.getPiece().getColor().equals(origem.getPiece().getColor())) {
                    validate = false;
                } else {

                    validate = checkPosition(origem, destino, board);

                }
            } else {
                validate = checkPosition(origem, destino, board);
            }


        }

        return validate;
    }

    private boolean checkPosition(Square origem, Square destino, Board board) {
        boolean validate = false;

        Square[] possibleDestiny = new Square[64];
        int countDestiny = 0;

        int j = 1; // Direção NE
        while (origem.getPositionX() + j < 8 && origem.getPositionY() + j < 8) {
            if (board.getGrid()[origem.getPositionX() + j][origem.getPositionY() + j].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() + j][origem.getPositionY() + j];
                countDestiny++;
            } else {

                if (!board.getGrid()[origem.getPositionX() + j][origem.getPositionY() + j].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() + j][origem.getPositionY() + j];
                    countDestiny++;
                }

                break;

            }
            j++;
        }

        j = 1; // Direção NO
        while (origem.getPositionX() - j >= 0 && origem.getPositionY() + j < 8) {
            if (board.getGrid()[origem.getPositionX() - j][origem.getPositionY() + j].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() - j][origem.getPositionY() + j];
                countDestiny++;
            } else {

                if (!board.getGrid()[origem.getPositionX() - j][origem.getPositionY() + j].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() - j][origem.getPositionY() + j];
                    countDestiny++;
                }

                break;

            }
            j++;
        }

        j = 1; //Direção SO
        while (origem.getPositionX() - j >= 0 && origem.getPositionY() - j >= 0) {
            if (board.getGrid()[origem.getPositionX() - j][origem.getPositionY() - j].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() - j][origem.getPositionY() - j];
                countDestiny++;
            } else {

                if (!board.getGrid()[origem.getPositionX() - j][origem.getPositionY() - j].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() - j][origem.getPositionY() - j];
                    countDestiny++;
                }

                break;

            }
            j++;
        }

        j = 1; // Direção SE
        while (origem.getPositionX() + j < 8 && origem.getPositionY() - j >= 0) {
            if (board.getGrid()[origem.getPositionX() + j][origem.getPositionY() - j].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() + j][origem.getPositionY() - j];
                countDestiny++;
            } else {

                if (!board.getGrid()[origem.getPositionX() + j][origem.getPositionY() - j].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() + j][origem.getPositionY() - j];
                    countDestiny++;
                }

                break;

            }
            j++;
        }

        for (int i = origem.getPositionX() + 1; i < 8; i++) {
            if (board.getGrid()[i][origem.getPositionY()].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[i][origem.getPositionY()];
                countDestiny++;
            } else {

                if (!board.getGrid()[i][origem.getPositionY()].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[i][origem.getPositionY()];
                    countDestiny++;
                }

                break;

            }
        }

        for (int i = origem.getPositionX() - 1; i >= 0; i--) {
            if (board.getGrid()[i][origem.getPositionY()].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[i][origem.getPositionY()];
                countDestiny++;
            } else {

                if (!board.getGrid()[i][origem.getPositionY()].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[i][origem.getPositionY()];
                    countDestiny++;
                }


                break;

            }
        }

        for (int i = origem.getPositionY() + 1; i < 8; i++) {
            if (board.getGrid()[origem.getPositionX()][i].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][i];
                countDestiny++;
            } else {

                if (!board.getGrid()[origem.getPositionX()][i].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][i];
                    countDestiny++;
                }


                break;

            }
        }

        for (int i = origem.getPositionY() - 1; i >= 0; i--) {
            if (board.getGrid()[origem.getPositionX()][i].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][i];
                countDestiny++;
            } else {

                if (!board.getGrid()[origem.getPositionX()][i].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][i];
                    countDestiny++;
                }

                break;

            }
        }





        for (int i = 0; i <= countDestiny - 1; i++) {




            if (destino == possibleDestiny[i]) {
                validate = true;
                break;
            }

        }


        return validate;
    }

    public String toString() {
     //   System.out.println("rainha");
        return "rainha";
    }
}
